iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
SideProject30

拿到一支Garmin錶,要怎麼開發app?系列 第 13

[Day-13] Monkey C的那些規則-7-callback

  • 分享至 

  • xImage
  •  

今天看的部分是Monkey C的callback function,
在js常常會使用到,但是用法好像沒這麼複雜...
雖然java也有類似的寫法,但原諒我學藝不精,平常又根本沒在用calllback function,只能邊看邊理解了

首先在Monkey C,通常不能直接使用其他class內的function,只能透過method來實現,
以下方的官方釋例看,有個class叫做MyClass,裡面有個function叫operation

class MyClass {
    function operation(a, b) {
        //nothing
    }
}

如果在其他地方要使用operation(a,b)
就必須先new一個MyClass的實例,
接著使用.method(:operation)來將operation這個function存進變數myObject
再來使用invoke將參數傳入function,
這種間接的使用方式有點...不直覺...

function myFunction() {
    // Create a new instance of MyClass
    var myObject = new MyClass();
    // Get a callback for the "operation" method from myObject
    var myMethod = myObject.method(:operation);
    // Invoke myObjects's "operation" method
    myMethod.invoke(1, 2);
}

除了class內的function不可被其他人直接呼叫使用之外,在Monkey C,function也不能被拿來當作參數使用,
因此若要寫成callback function的寫法,因此也必須要仰賴.method(:function)來把function物件化,
變成物件之後,就可以透過參數傳遞了,
然後在這個物件上使用.invoke,來間接達到callback的效果。

補充:
如果要使用的function在module而不是在class,則要用以下寫法:

using Toybox.Lang as Lang;

module MyModule
{
    function operation() {
        // Some more amazing code. Only an infinite number of monkeys typing randomly over an
        // infinite period of time could write something this good.
    }
}

function myFunction() {
    var myMethod = new Lang.Method(MyModule, :operation);
    myMethod.invoke();
}

這是因為module不是物件,所以沒有繼承.method()這個方法,
所以要另外new一個Method物件,來將module內的function物件化


上一篇
[Day-12] Monkey C的那些規則-6-Module
下一篇
[Day-14] Monkey C的那些規則-8-weak reference & strong reference
系列文
拿到一支Garmin錶,要怎麼開發app?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言